package com.chenwc.common.util;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Util {

    private static final Logger logger = LoggerFactory.getLogger(Util.class);

    /**
     * 把 InputStream 流写入本地文件
     * @param inputStream InputStream 流
     * @param filePath 待写入本地文件全路径+文件名
     */
    public static void convertInputStreamToLocalFile(InputStream inputStream, String filePath){
        logger.info("保存文件路径：" + filePath);
        File file = new File(filePath);
        //log.info("保存文件路径：" + file.getAbsolutePath());
        FileOutputStream fos = null;
        try {
            if (!file.exists()) {
                if (!mkdirParents(file)) {
                    logger.info("创建父级目录失败！");
                    return;
                }
                if(!file.createNewFile()){
                    logger.info("创建文件: {} 失败！", filePath);
                    return;
                }
            }
            fos = new FileOutputStream(file);
            byte[] b = new byte[1024];
            while ((inputStream.read(b)) != -1) {
                // 写入数据
                fos.write(b);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != inputStream) {
                    inputStream.close();
                }
                if (null != fos) {
                    //保存数据
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 判断文件的父级目录是否存在，不存在则创建
     * @param file 文件
     * @return true 父级目录存在或创建父级目录成功， false创建父级目录失败
     */
    public static boolean mkdirParents(File file){
        if (!file.getParentFile().exists()) {
            return file.getParentFile().mkdirs();
        }
        else {
            return true;
        }
    }

    /**
     * bytes 转成 kb
     *
     * @param val bytes
     * @return kb
     */
    public static double calKb(double val) {
        return val / 1024.00;
    }

    /**
     * 复制文件夹中的文件到另一个文件夹
     * @param sourceDirectory 源文件夹
     * @param targetDirectory 目标文件夹
     */
    public static void batchMoveFilesInFolders(String sourceDirectory, String targetDirectory){
        Path sourcePath = Paths.get(sourceDirectory);
        Path targetPath = Paths.get(targetDirectory);
        try {
            FileUtils.copyDirectory(sourcePath.toFile(), targetPath.toFile());
        } catch (Exception e){
            logger.error("Error occurred: ", e);
        }
    }
}
